<?php

include_once 'CtlGeneral.php';

include_once '../entities/Grupo.php';
include_once '../entities/CursoTaller.php';
include_once '../entities/ServidorSocial.php';
include_once '../entities/ActividadGrupo.php';
include_once '../entities/Modulo.php';
include_once '../entities/Profesor.php';
include_once '../entities/Horario.php';

include_once '../boundaries/gestionarGrupos/BoundFormularioGrupo.php';
include_once '../boundaries/gestionarGrupos/Comunicados/FrmComPago.php';
include_once '../boundaries/gestionarGrupos/Comunicados/FrmComConsta.php';
include_once '../boundaries/gestionarGrupos/Comunicados/FrmComFirmaConsta.php';
include_once '../boundaries/gestionarGrupos/Comunicados/FrmComRevistas.php';

include_once '../boundaries/gestionarGrupos/Anexos/FrmAnexPagoProf.php';
include_once '../boundaries/gestionarGrupos/Anexos/FrmAnexSoliConst.php';
include_once '../boundaries/gestionarGrupos/Anexos/FrmAnexListAlumn.php';
include_once '../boundaries/gestionarGrupos/Anexos/FrmAnexSoliConstAcep.php';
include_once '../boundaries/gestionarGrupos/Anexos/FrmAnexSoliConstRecha.php';

class CtlGestionGrupos extends CtlGeneral {
   
    public function __construct($param, $file) {
        
        switch ($param['opc']) {
            
            case 'menuProfEvalFinal': echo $this->listarProfesores($param['id'], $param['opc']);
                break;
                
            case 'menuAsigProfeEvalFinal': echo $this->listarProfesores($param['id'], $param['opc']);
                break;
            
            case 'asigProfeEvalFinal': $this->asignarProfesorEvalFinal($param['idGrupo'], $param['id']);
                break;
            
            case 'modifGrupo': $this->modifiGrupo($param['id'], $param);
                break;
            
            case 'desasigProfeEvalFinal': $this->desasignarProfesorEvalFinal($param['idGrupo'], $param['id']);
                break;
            
            case 'regisGrupo': $this->regisGrupo($param);
                break;
            
            case 'mostrarTodos': 
                
                echo $this->insertarTitulo("Todos los Grupos");
                
                    echo "<br><input type='button' id='regis' name='regis' value='Registrar' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'frmRegisGrupo', 'vacio', 'contenido')\">
                        <input type='button' id='buscar' name='buscar' value='Grupos activos' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'menuPrinc', 'vacio', 'contenido')\" >";
                
                        echo $this->listarGrupos('GGT');
                break;

            case 'menuPrinc': 
                
                echo $this->insertarTitulo("Grupos activos");
                
                    echo "<br><input type='button' id='regis' name='regis' value='Registrar' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'frmRegisGrupo', 'vacio', 'contenido')\">
                        <input type='button' id='buscar' name='buscar' value='Todos los grupos' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'mostrarTodos', 'vacio', 'contenido')\" >";
                
                        echo $this->listarGrupos("GG");
                break;
            
            case 'listarModulos': $this->listarModulosDeCursoTaller($param['id']);
                break;
            
            case 'frmRegisGrupo': $this->mostrarBoundFormulario('R', 0);
                break;
            
            case 'frmDetallesGrupo': $this->mostrarBoundFormulario('D', $param['id']);
                break;
            
            case 'frmModificarGrupo': $this->mostrarBoundFormulario('M', $param['id']);
                break;
            
            case 'mostrarContrato': $this->menuContrato($param['tipo'], $param['id'], $param['dir']);
                break;
                
            case 'cargarContrato': $this->cargarContrato($param['id'], $file);
                break;
            
            case 'cancelGrupo': $this->cancelarGrupo($param['id']);
                break;
            
            case 'constanciasEntregadas': $this->marcarConstanciasEntregadas($param['id']);
                break;
            
            case 'menuComunAnexos': $this->menuComunicAnexos($param['id']);
                break;
            
            case 'comunPago': $this->generarComunPago($param['id']);
                break;
            
            case 'comunConsta': $this->generarComunConstan($param['id']);
                break;
            
            case 'comunFirmaConsta': $this->generarComunFirmaConsta($param['id']);
                break;
            
            case 'comunRevis': $this->generarComunRevis($param['id']);
                break;
            
            case 'anexPagoProf': $this->generarAnexPagoProf($param['id']);
                break;
            
            case 'anexSoliConst': $this->generarAnexSoliConst($param['id']);
                break;
            
            case 'anexListAlumn': $this->generarAnexListAlumn($param['id']);
                break;
            
            case 'anexListConstConDer': $this->generarAnexListConstConDer($param['id']);
                break;
            
            case 'anexListConstSinDer': $this->generarAnexListConstSinDer($param['id']);
                break;
            
            default: echo "No ha seleccionado una opción valida";
        }
    }
    
    private function generarAnexListConstSinDer ($idGrupo) {
        $grupo = new Grupo();
        $inscr = new Inscripcion();
        $grupoReturn = $grupo->obtenerPorId($idGrupo);
        
        $alumnos = new Alumno();
        $alumnos = $alumnos->listarAlumnos(" JOIN INSCRIPCION ON (inidalumno = alidalumno) WHERE inidgrupo = $idGrupo");
        
        $minAsistencias = $grupo->totalDiasClases($idGrupo) * 0.80;
        
        $alumnosReturn;
        $totalAlumConDer = 0;
        
        foreach ($alumnos as $alumno) {
            
            if ($alumno['inasistencias'] < $minAsistencias || !$inscr->isEvaluoProfesores($idGrupo, $alumno['inidinscripcion'])) {
                $alumnosReturn[$totalAlumConDer] = $alumno;
                
                $totalAlumConDer++;
            }
            
        }
        
        $grupoReturn['alumnos'] = isset($alumnosReturn) ? $alumnosReturn : null;
        
        new FrmAnexSoliConstRecha($grupoReturn);
    }
    
    private function generarAnexListConstConDer ($idGrupo) {
        $grupo = new Grupo();
        $inscr = new Inscripcion();
        $grupoReturn = $grupo->obtenerPorId($idGrupo);
        
        $alumnos = new Alumno();
        $alumnos = $alumnos->listarAlumnos(" JOIN INSCRIPCION ON (inidalumno = alidalumno) WHERE inidgrupo = $idGrupo");
        
        $minAsistencias = $grupo->totalDiasClases($idGrupo) * 0.80;
        
        $alumnosReturn;
        $totalAlumConDer = 0;
        
        foreach ($alumnos as $alumno) {
            
            if ($alumno['inasistencias'] >= $minAsistencias && $inscr->isEvaluoProfesores($idGrupo, $alumno['inidinscripcion'])) {
                $alumnosReturn[$totalAlumConDer] = $alumno;
                
                $totalAlumConDer++;
            }
            
        }
        
        $grupoReturn['alumnos'] = isset($alumnosReturn) ? $alumnosReturn : null;
        
        new FrmAnexSoliConstAcep($grupoReturn);
    }
    
    private function generarAnexListAlumn ($idGrupo) {
        $grupo = new Grupo();
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        $alumnos = new Alumno();
        $alumnos = $alumnos->listarAlumnos(" JOIN INSCRIPCION ON (inidalumno = alidalumno) WHERE inidgrupo = $idGrupo");
        
        $grupo['alumnos'] = $alumnos;
        
        new FrmAnexListAlumn($grupo);
    }
    
    private function generarAnexSoliConst ($idGrupo) {
        $grupo = new Grupo();
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        $profesores = new Profesor();
        $profesores = $profesores->listarProfesores(" JOIN moduloprofesor ON (mopridprofesor = pridprofesor) 
                                                        JOIN modulo ON (mopridmodulo = moidmodulo) WHERE mopridgrupo = $idGrupo ");
        
        $grupo['profesores'] = $profesores;
        
        $alumnos = new Alumno();
        $alumnos = $alumnos->listarAlumnos(" JOIN INSCRIPCION ON (inidalumno = alidalumno) WHERE inidgrupo = $idGrupo");
        
        $grupo['alumnos'] = $alumnos;
        
        new FrmAnexSoliConst($grupo);
    }


    private function generarAnexPagoProf ($idGrupo) {
        $grupo = new Grupo();
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        $profesores = new Profesor();
        $profesores = $profesores->listarProfesores(" JOIN moduloprofesor ON (mopridprofesor = pridprofesor) 
                                                        JOIN modulo ON (mopridmodulo = moidmodulo) WHERE mopridgrupo = $idGrupo ");
        
        $grupo['profesores'] = $profesores;
        
        //Obtenemos el arreglo de días
        $grupo['dias'] = $this->obtenerDiasAPalabras($grupo['hodia']);
        
        new FrmAnexPagoProf($grupo);
    }
    
    private function generarComunRevis ($idGrupo) {
        
        //Obtenemos los datos del grupo (grupo, curstoTaller y horario
        $grupo = new Grupo();
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        new FrmComRevistas($grupo);
    }
    
    private function generarComunFirmaConsta ($idGrupo) {
        
        //Creamos el objeto de tipo grupo
        $grupo = new Grupo();
        
        //Obtenemos el total de alumnos inscritos
        $numAlumnos = $grupo->numAlumInscri($idGrupo);
        
        //Obtenemos los datos del grupo
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        $grupo['numAlumnos'] = $numAlumnos;
        
        //Obtenemos el total de módulos y lo asignamos en el arreglo grupo
        $numModulos = new Modulo();
        $numModulos = $numModulos->listarModulosPorIdCursoTaller($grupo['cutaidcursotaller']);
        $numModulos = count($numModulos);
        $grupo['nummodulos'] = $numModulos;
        
        new FrmComFirmaConsta($grupo);
    }
    
    private function generarComunConstan ($idGrupo) {
        
        //Creamos el objeto de tipo grupo
        $grupo = new Grupo();
        
        //Obtenemos el total de alumnos inscritos
        $numAlumnos = $grupo->numAlumInscri($idGrupo);
        
        //Obtenemos los datos del grupo
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        $grupo['numAlumnos'] = $numAlumnos;
        
        //Obtenemos el total de módulos y lo asignamos en el arreglo grupo
        $numModulos = new Modulo();
        $numModulos = $numModulos->listarModulosPorIdCursoTaller($grupo['cutaidcursotaller']);
        $numModulos = count($numModulos);
        $grupo['nummodulos'] = $numModulos;
        
        new FrmComConsta($grupo);
    }
    
    private function generarComunPago ($idGrupo) {
        
        //Obtenemos los datos del grupo (grupo, curstoTaller y horario
        $grupo = new Grupo();
        $grupo = $grupo->obtenerPorId($idGrupo);
        
        //Obtenemos el total de módulos y lo asignamos en el arreglo grupo
        $numModulos = new Modulo();
        $numModulos = $numModulos->listarModulosPorIdCursoTaller($grupo['cutaidcursotaller']);
        $numModulos = count($numModulos);
        $grupo['nummodulos'] = $numModulos;
        
        //Obtenemos el arreglo de días
        $grupo['dias'] = $this->obtenerDiasAPalabras($grupo['hodia']);
        
        new FrmComPago($grupo);
    }
    
    private function menuComunicAnexos ($idGrupo) {
        echo $this->insertarTitulo("Comunicados y Anexos");
        ?><br>
            <table>
                <tr>
                    <td colspan="2"><input type="button" value="Regresar" onclick="ajax('controllers/CtlGestionGrupos.php', 'menuPrinc', 'vacio', 'contenido')"></td>
                </tr>
                <tr>
                    <th>Comunicados</th>
                    <th>Anexos</th>
                </tr>
                <tr>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=comunConsta&id=<? echo $idGrupo ?>" target="_blank">Petición de constancias</a></td>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=anexListConstSinDer&id=<? echo $idGrupo ?>" target="_blank">Lista de constancias canceladas por grupo (Alumnos sin derecho a constancia)</a></td>
                </tr>
                <tr>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=comunFirmaConsta&id=<? echo $idGrupo ?>" target="_blank">Firma de constancias</a></td>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=anexPagoProf&id=<? echo $idGrupo ?>" target="_blank">Relación costo/tiempo por profesor</a></td>
                </tr>
                <tr>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=comunRevis&id=<? echo $idGrupo ?>" target="_blank">Solicitud de Revistas</a></td>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=anexListConstConDer&id=<? echo $idGrupo ?>" target="_blank">Lista de entrega de constancias (Alumnos con derecho a constancia)</a></td>
                </tr>
                <tr>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=comunPago&id=<? echo $idGrupo ?>" target="_blank">Solicitud de pago</a></td>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=anexSoliConst&id=<? echo $idGrupo ?>" target="_blank">Lista de constancias por grupo</a></td>
                </tr>
                <tr>
                    <td></td>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=anexListAlumn&id=<? echo $idGrupo ?>" target="_blank">Lista de asistencia</a></td>
                </tr>
                <tr>
                    <td></td>
                    <td><a href="controllers/CtlGestionGrupos.php?opc=comunPago&id=<? echo $idGrupo ?>" target="_blank">Gafetes</a></td>
                </tr>
            </table>
        <?
    }

    private function marcarConstanciasEntregadas ($idGrupo) {
        
        $grupo = new Grupo();
        
        if ($grupo->marcarConstanciasEntregadas($idGrupo)) {
            echo $this->insertarTitulo("Se ha registrado la entrega de constancias");
        } else {
            echo $this->insertarTitulo("Ocurrio un problema al marcar como entregadas las constancias");
        }
        
        $this->mostrarBoundFormulario('M', $idGrupo);
    }

    private function cancelarGrupo ($idGrupo) {
        
        $grupo = new Grupo();
        
        if ($grupo->modificarEstado($idGrupo, 'X')) {
            
            echo $this->insertarTitulo("El grupo ha sido cancelado");
        } else {
            echo $this->insertarTitulo("Ocurrio un problema al cancelar al grupo");
        }
        
        echo $this->insertarTitulo("Grupos activos");
                
        echo "<br><input type='button' id='regis' name='regis' value='Registrar' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'frmRegisGrupo', 'vacio', 'contenido')\">
            <input type='button' id='buscar' name='buscar' value='Todos los grupos' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'mostrarTodos', 'vacio', 'contenido')\" >";
        
        echo $this->listarGrupos("GG");
    }

    private function desasignarProfesorEvalFinal ($idGrupo, $idProfesor) {
        $grupo = new Grupo();
        
        echo $this->insertarTitulo( (($grupo->desasignaProfesorEvalFinal($idGrupo, $idProfesor) != false) ? "Se desasignado el profesor del curso" : "Error: Ya tiene evaluaciones registradas") );
        
        echo $this->listarProfesores($idGrupo, 'menuProfEvalFinal');
    }
    
    private function asignarProfesorEvalFinal ($idGrupo, $idProfesor) {
        $grupo = new Grupo();
        
        echo $this->insertarTitulo( (($grupo->asignaProfesorEvalFinal($idGrupo, $idProfesor) != false) ? "Se asignado el profesor al curso" : "Ha ocurrido un problema al asignar al profesor") );
        
        echo $this->listarProfesores($idGrupo, 'menuProfEvalFinal');
    }

    private function listarProfesores ($idGrupo, $casoUso) {
                
        //Creamos el objeto de tipo Profesor
        $profesores = new Profesor();
        //Obtenemos de la BD la lista de grupos
        if ($casoUso == 'menuProfEvalFinal') {
            $listaProfesores = $profesores->listarProfesoresEvalFinal($idGrupo);
        } else {
            $listaProfesores = $profesores->listarProfesoresNoAsignadosEvalFinal($idGrupo);
        }
        
        $tablaEnHTML = $this->insertarTitulo( ( (($casoUso == 'menuProfEvalFinal')) ? "Profesores asignados a evaluacion de proyectos" : "Asignar profesores" ) );

        $tablaEnHTML .= "<br><br><br>". ( ($casoUso != 'menuAsigProfeEvalFinal') ? "<input type='button' name='regis' value='Asignar Profesor' onclick=\"ajaxConId('controllers/CtlGestionGrupos.php', 'menuAsigProfeEvalFinal', 'vacio', 'contenido', $idGrupo)\" >" : "")
                                ."<input type='button' name='regis' value='Regresar' onclick=\"ajaxConId('controllers/CtlGestionGrupos.php', '". (($casoUso != 'menuAsigProfeEvalFinal') ? "menuPrinc" : "menuProfEvalFinal") ."', 'vacio', 'contenido', $idGrupo)\" >";
        
        //Cabecera de la tabla
        $tablaEnHTML .= "<form id='asignarGrupo'>
                    <input type='hidden' name='idGrupo' value='$idGrupo' >
                </form>
            <table class='tablas_sort'>
                            <thead>
                                <tr>
                                    <th>Ape. Paterno</th>
                                    <th>Ape. Materno</th>
                                    <th>Nombre</th>
                                    <th>No. Trabajador</th>
                                    <th>Opciones</th>
                                </tr>
                            </thead><tbody>";
        
        //Recorremos los valores de la tabla
        if ($listaProfesores != false) foreach ($listaProfesores as $profesor) {
            
            //Mostramos cada renglón de la tabla
            $tablaEnHTML .= "<tr>
                                <td>$profesor[peapepat] </td>
                                <td>$profesor[peapemat] </td>            
                                <td>$profesor[penombre]</td>
                                <td>$profesor[prnumtrabajador]</td>
                                <td>";
            
            if ($casoUso == 'menuProfEvalFinal') {
                $tablaEnHTML .= "<input type='button' name='regis' value='Desasignar' onclick=\"ajaxConId('controllers/CtlGestionGrupos.php', 'desasigProfeEvalFinal', 'asignarGrupo', 'contenido', '$profesor[pridprofesor]')\" >";
                
            } else if ($casoUso == 'menuAsigProfeEvalFinal') {
                $tablaEnHTML .= "<input type='button' name='regis' value='Asignar' onclick=\"ajaxConId('controllers/CtlGestionGrupos.php', 'asigProfeEvalFinal', 'asignarGrupo', 'contenido', '$profesor[pridprofesor]')\" >";
            }
            
            $tablaEnHTML .= "</td></tr>";
        }
        
        //Cerramos la tabla
        $tablaEnHTML .= "</tbody></table><script type='text/javascript'>
                        ajax('controllers/gestionarCurriculum/CtlCurriculum.php', 'certi_listar', 'vacio', 'contenido');
                </script>";
        
        return $tablaEnHTML;
    }

    private function modifiGrupo ($idGrupo, $param) {
        
        //Objeto para manejar la transacción
        $transaction = new Grupo();
        
        //ESTOS OBJETOS SE PONEN HASTA ARRIBA PARA QUE NO INTERFIERAN CON LA TRANSACCION (SON CONSULTAS SELECTS)
        //Creamos el objeto Módulo y obtenemos una lista de los módulos
        $listaModulos = new Modulo();
        $listaModulos = $listaModulos->listarModulosPorIdCursoTaller($param['curTall']);
        //Creamos el objeto ActividadGrupo y obtenemos una lista de las actividades
        $listaActi = new ActividadGrupo();
        $listaActi = $listaActi->listarActividades();
        
        //Iniciamos la transacción
        $transaction->iniTransaccion();
        
        //Creamos el objeto grupo para modificar los datos del grupo
        $grupo = new Grupo();
        
        //Variable que tendrá los días de la semana seleccinados
        $dias = "";
        //Extraer los días marcados
        foreach ($param['dias'] as $dia){
            $dias .= $dia . "-";
        }
        
        //Bandera para saber si todos los registros se actualizarón correctamente
        $insertsModuloSuccess = true;
        
        //Actualizamos los datos de grupo junto con su horario
        $insertsModuloSuccess = $grupo->actualizar($idGrupo, $param['fecIni'], $param['fecFin'], $param['minAlum'], $param['sede'], $param['lugar'], $param['costo'], $param['tipo'], ( $param['tipo'] == 'E' ? (isset($param['coment']) ? $param['coment'] : '') : '' ),
                                                                                                            $param['horaIni'], $param['horaFin'], $dias);
        
        //Recorremos la lista de los modulos y determinamos con su ID (del módulo) que profesor fue asigando a dicho módulo.
        //En la implementación de HTML por cada etiqueta SELECT para elegir un profesor, el nombre del SELECT es 'profesor[idModulo al que se asigna]'
        foreach ($listaModulos as $modulo) {
            
            $cadPos = 'profesor'.($modulo['moidmodulo']);
            
            $idProfesor = $param[$cadPos];
            
            $insertsModuloSuccess = ($grupo->modificarProfesorModulo($idGrupo, $modulo['moidmodulo'], $idProfesor) != false ? $idGrupo : false );
        }
        
        //Bandera para saber si todos los registros se insertarón
        $insertsActividadSuccess = true;
        
        //Recorremos la lista de los actividades y determinamos con su ID (del módulo) que profesor fue asigando a dicho módulo.
        //En la implementación de HTML por cada SELECT para elegir un profesor, el nombre del SELECT es 'profesor[idModulo al que se asigna]'
        foreach ($listaActi as $actividad) {
            
            $cadPos = 'servidor'.($actividad['acgridactividadgrupo']);
            
            if (isset($param[$cadPos])) {
                
                $idServidor = $param[$cadPos];
            
                $insertsActividadSuccess = ($grupo->establecerServidorActividad($idGrupo, $actividad['acgridactividadgrupo'], $idServidor) != false ? true : false );
            }
        }
        
        //Verificamos que no existan errores
        $idGrupo = ( ($idGrupo != false && $insertsModuloSuccess != false && $insertsActividadSuccess != false) ? $idGrupo : false );
        
        //Si no hay errores hacemos COMMIT, en caso contrario ROLLBACK
        if ( $idGrupo != false ) {
            $transaction->finTransaccion(); 
        } else {
            $transaction->rollback();
        }
        
        echo $this->insertarTitulo( ($idGrupo != false ? "El grupo ha sido modificado satisfactoriamente" : "Algún error al modificar el grupo
                                                                                                            <br>Grupos activos
                                                                                                                <br><input type='button' id='regis' name='regis' value='Registrar' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'frmRegisGrupo', 'vacio', 'contenido')\">
                                                                                                                        <input type='button' id='buscar' name='buscar' value='Todos los grupos' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'mostrarTodos', 'vacio', 'contenido')\" >" ) );
                
        ( $idGrupo != false ? $this->mostrarBoundFormulario('M', $idGrupo) : $this->listarGrupos("GG"));
        
        return $idGrupo;
    }

    private function menuContrato ($tipo, $id, $dir) {
        if ($tipo == 'M' && $dir == "") {
            echo "<body style='margin-top: 0px; margin-bottom: 0px;'>
                    <form action='CtlGestionGrupos.php' method='post' enctype='multipart/form-data' name='file' id='file' target='_self'>
                        <input type='hidden' name='opc' value='cargarContrato' />
                        <input type='hidden' name='id' value='$id' />
                        <input type='file' name='file' /><input type='submit' value='Subir hoja contrato'>
                    </form>
                </body>";
        } else  {
            echo "<body style='margin-top: 0px; margin-bottom: 0px;'>
                    ". ( ($dir != "") ? "<a href='../docs/contratosProfe/$dir' target='_blank' >Descargar hoja de contrato</a>" : "Aun no se ha subido contrato" ) ."<br>
                    ".( $tipo == 'M' ? ("<a href='CtlGestionGrupos.php?opc=mostrarContrato&dir=&id=$id&tipo=M'>Cambiar la hoja de contrato</a>") : "" )."</body>";
        }
    }

    private function cargarContrato($id, $file) {
        
        //Definimos el tipo de archivo permitido
        $extenPermi = array("pdf", "jpeg", "jpg", "png");
        $temp = explode(".", $file["file"]["name"]);
        $exten = end($temp);

        $nomArch = $file['file']['name'];

        if ($nomArch == "") {
            print "Debes seleccionar un archivo<br><a href='CtlGestionGrupos.php?opc=mostrarContrato&dir=&id=$id&tipo=M'>Volver a intentar</a>";
            
        //Si el archivo es de un formato no permitido
        } else if (!in_array($exten, $extenPermi)) { 
            
            echo "Archivo no permitido<br><a href='CtlGestionGrupos.php?opc=mostrarContrato&dir=&id=$id&tipo=M'>Volver a intentar</a>";
        } else {
            
            //Creamos el objeto de tipo profesor y obtenemos sus datos junto con su módulo
            $profesor = new Profesor();
            $profesor = $profesor->obtenerPorIdModuloProfesor($id);
            
            //$profesor['moprdircartacompro'] == "" ? "" : unlink("../docs/contratosProfe/$profesor[moprdircartacompro]");
            
            //Nombramos el archivo de la sig manera apePatNombreProfeNombreModuloNombreRealArchivo
            $nomArch = "$profesor[peapepat]$profesor[peapemat]$profesor[penombre]$profesor[monombre].$exten";

            $destino = "../docs/contratosProfe/$nomArch";

            if (move_uploaded_file($file['file']['tmp_name'], $destino)) {
                
                $grupo = new Grupo(); $grupo->registrarContratoProfesorModulo($id, $nomArch);
                
                $this->menuContrato('M', $id, $nomArch);
            } else {
                print "El archivo no pudo ser guardado<br><a href='CtlGestionGrupos.php?opc=mostrarContrato&dir=&id=$id&tipo=M'>Volver a intentar</a>";
            }            
        }
    }

    private function listarModulosDeCursoTaller ($id) {
        
        $listaModulos = new Modulo(); $listaModulos = $listaModulos->listarModulosPorIdCursoTaller($id);
        
        $eTotalHoras = 0;
        
        echo "<tr><th colspan='2'>Módulos</th></tr>";
                                    
        foreach ($listaModulos as $modulo) {
            echo "<tr>
                    <td>$modulo[monombre] - $modulo[mohoras] horas</td>";

                    $this->listarProfesoresPorModulo($modulo['moidmodulo']);

            $eTotalHoras += $modulo['mohoras'];
        }
        echo "<tr>
                <td>Total horas módulos - $eTotalHoras horas</td>
            </tr>";
    }
    
    private function listarProfesoresPorModulo ($idModulo) {
        
        $listaProfesor = new Profesor(); $listaProfesor = $listaProfesor->listarProfesores(" WHERE prEstado = 'A' ");
        
        ?>
            <th><select id="curTall" name="profesor<? echo $idModulo ?>" class="required">
                <option value="">Seleccione un Profesor</option>
        <?
            foreach ($listaProfesor as $profsoer) {
                echo "<option value='$profsoer[peidpersona]'>$profsoer[penombre] $profsoer[peapepat] $profsoer[peapemat]</option>";
            }
        ?>
                </select></th>
        <?
    }

    /* Lalo
     * Función para los formularios de Registro, Ver detalles y Modificar
        @param 
        $tip: tipo de formulario: Regis, detalles, modif    
        $idGrupo: en caso de que el formualario sea para Detalles y Modif se solicita el ID del grupo*/
    private function mostrarBoundFormulario ($tipo, $idGrupo) {
        
        //Creamos los objetos que tendran la lista de ServidorSocial, ActividadesGrupo y CursoTaller y les asiganmos las listas 
        $listaServid = new ServidorSocial(); $listaServid = $listaServid->listarServidores();
        $listaActivi = new ActividadGrupo(); $listaActivi = $listaActivi->listarActividades();
        $listaCursoTaller = new CursoTaller();
        
        if ($tipo == 'R') {
             
            $listaCursoTaller = $listaCursoTaller->listarCursoTaller();
            
            new BoundFormularioGrupo($tipo, null, $listaCursoTaller, null, $listaActivi, $listaServid, null, null, null, null);
        } else {
            //Obtenemos los datos del grupo para modificar o ver detalles
            $grupo = new Grupo(); $grupo = $grupo->obtenerPorId($idGrupo); 
            
            $dias = explode('-', $grupo['hodia']);
            
            //Obtenemos el Curso/taller que les corresponde al grupo
            $listaCursoTaller = $listaCursoTaller->obtenerPorId($grupo['gridcursotaller']);
            $cursoTaller = $listaCursoTaller;
            
            //Obtenemos los módulos del grupo
            $listaModul = new Modulo(); $listaModul = $listaModul->listarModulosPorIdGrupos($grupo['gridgrupo']);
            
            //Obtenenmos los profesores 
            $listaProfesores = new Profesor(); $listaProfesores = $listaProfesores->listarProfesores("WHERE prEstado = 'A' ");
            
            //Obtenemos las relaciones para determinar que Profesor va impartir x Módulo
            $relacionModuProfe = new Modulo(); $relacionModuProfe = $relacionModuProfe->relacionModuloProfesor($grupo['gridgrupo']);
            
            //Obtener las relaciones entre servidor y actividad 
            $relacionActiServ = new ActividadGrupo(); $relacionActiServ = $relacionActiServ->relacionesActividadServidor($grupo['gridgrupo']);
            
            new BoundFormularioGrupo($tipo, $grupo, $cursoTaller, $dias, $listaActivi, $listaServid, $listaModul, $listaProfesores, $relacionModuProfe, $relacionActiServ);
        }
    }

    /* Lalo
     * Función para registrar los grupos
        $param: variable que contiene todas los datos del grupo*/
    private function regisGrupo ($param) {
        
        $transaction = new Grupo();

        //SE PONEN HASTA ARRIBA PARA QUE NO INTERFIERAN CON LA TRANSACCION
        //Creamos el objeto Módulo y obtenemos una lista de los módulos
        $listaModulos = new Modulo();
        $listaModulos = $listaModulos->listarModulosPorIdCursoTaller($param['curTall']);
        //Creamos el objeto ActividadGrupo y obtenemos una lista de las actividades
        $listaActi = new ActividadGrupo();
        $listaActi = $listaActi->listarActividades();
        
        //Iniciamos la transacción
        $transaction->iniTransaccion();
        
        //Creamos el objeto grupo y los registramos en la BD
        $grupo = new Grupo();
        $idGrupo = $grupo->registrar($param['curTall'], $param['fecIni'], $param['fecFin'], $param['minAlum'], $param['sede'], $param['lugar'], $param['costo'], $param['tipo'], ( $param['tipo'] == 'E' ? (isset($param['coment']) ? $param['coment'] : '') : '' ) );
        
        //Variable que tendrá los días de la semana seleccinados
        $dias = "";
        
        //Extraer los días marcados
        foreach ($param['dias'] as $dia){
            $dias .= $dia . "-";
        }

        //Creamos el objeto Horario y los registramos en la BD
        $horario = new Horario();
        $idHorario = $horario->registrar($idGrupo, $dias, $param['horaIni'], $param['horaFin']);
        
        //Bandera para saber si todos los registros se insertarón
        $insertsModuloSuccess = true;
        
        //Recorremos la lista de los modulos y determinamos con su ID (del módulo) que profesor fue asigando a dicho módulo.
        //En la implementación de HTML por cada SELECT para elegir un profesor, el nombre del SELECT es 'profesor[idModulo al que se asigna]'
        foreach ($listaModulos as $modulo) {
            
            $cadPos = 'profesor'.($modulo['moidmodulo']);
            
            $idProfesor = $param[$cadPos];
            
            $insertsModuloSuccess = ($grupo->registrarProfesorModulo($idGrupo, $modulo['moidmodulo'], $idProfesor) != false ? $idGrupo : false );
        }
        
        //Bandera para saber si todos los registros se insertarón
        $insertsActividadSuccess = true;
        
        //Recorremos la lista de los actividades y determinamos con su ID (de la Actividad) que servidor fue asigando a dicho módulo.
        //En la implementación de HTML por cada SELECT para elegir un servidor, el nombre del SELECT es 'servidor[idActividadGrupo al que se asigna]'
        foreach ($listaActi as $actividad) {
            
            $cadPos = 'servidor'.($actividad['acgridactividadgrupo']);
            
            if (isset($param[$cadPos])) {
                
                $idServidor = $param[$cadPos];
            
                $insertsActividadSuccess = ($grupo->establecerServidorActividad($idGrupo, $actividad['acgridactividadgrupo'], $idServidor) != false ? true : false );
            }
        }
        
        //Verificamos que no existan errores
        $idGrupo = ( ($idGrupo != false && $idHorario != false && $insertsModuloSuccess != false && $insertsActividadSuccess != false) ? $idGrupo : false );
        
        //Si no hay errores hacemos COMMIT, en caso contrario ROLLBACK
        if ( $idGrupo != false ) {
            $transaction->finTransaccion(); 
        } else {
            $transaction->rollback();
        }
        
        echo $this->insertarTitulo( ($idGrupo != false ? "El grupo ha sido registrado satisfactoriamente" : "Algún error al registrar el grupo
                                                                                                            <br>Grupos activos
                                                                                                                <br><input type='button' id='regis' name='regis' value='Registrar' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'frmRegisGrupo', 'vacio', 'contenido')\">
                                                                                                                        <input type='button' id='buscar' name='buscar' value='Todos los grupos' onclick=\"ajax('controllers/CtlGestionGrupos.php', 'mostrarTodos', 'vacio', 'contenido')\" >"  ) );
                
                    ( $idGrupo != false ? $this->mostrarBoundFormulario('D', $idGrupo) : $this->listarGrupos("GG") );
        
        return $idGrupo;
    }
}
        
//Linea para construir e invocar la clase control
new CtlGestionGrupos(( isset($_POST['opc']) ? $_POST : $_GET ), $_FILES);
?>